﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Text.RegularExpressions;

namespace FeiYang
{
    public enum _Boss表项_
    {
        将军殿_,
        中枢大殿_,
        角斗场_,
        外五蛇_,
        内五蛇_,
        未知蛇_,
        未知尸霸_,
        逆魔大殿逆魔_,
        黑暗利爪_,
        黑暗闪电_,
        // 2
        魔穴魔王_,
        九重坐骑_,
        地八魔王_,
        魔宫魔王_,
        天空阿修罗_,
        海魔_,
        逆魔大殿逆魔王_,
        真将军殿狂尸霸_,
        玄冰殿蛇_,
        玄冰殿蛇王_,
        // 3
        焰火机关_,
        焰火尸霸_,
        焰火蛇_,
        焰火逆魔_,
        焰火通天_,
        焰火禁地_,
        战八机关_,
        法八机关_,
        道八机关_,
        战十一尸霸_,
        //4
        法十一尸霸_,
        道十一尸霸_,
        战十五蛇1_,
        战十五蛇2_,
        法十五蛇1_,
        法十五蛇2_,
        道十五蛇1_,
        道十五蛇2_,
        战十八逆魔_,
        法十八逆魔_,
        //5
        道十八逆魔_,
        战二十二闪电_,
        战二十二利爪_,
        法二十二闪电_,
        法二十二利爪_,
        道二十二闪电_,
        道二十二利爪_,
        战二十三禁地_,
        法二十三禁地_,
        道二十三禁地_,
        // 6
        桃园机关_,
        桃园尸霸_,
        桃园逆魔_,
        桃园蛇1_,
        桃园蛇2_,
        桃园禁地_,
        桃园通天_,
        魔三机关_,
        魔七逆魔_,
        魔八利爪_,
        // 7
        魔八闪电_,
        魔八禁地_,
        魔九通天_,
        魔十魔君_,
        千年帝王_,
        神秘暗殿通天_,
        绝情谷楼兰_,
        数量_ = 绝情谷楼兰_,
    }

    public class Boss提醒_
    {
        private TimeSpan _时间;
        public Boss提醒_(string 时间, int 页, Rectangle 范围, _Boss表项_ 表项)
        {
            this.时间 = Boss提醒_.编译(时间);
            this.页 = 页;
            this.范围 = 范围;
            this.表项 = 表项;
        }

        public static TimeSpan 编译(string 时间)
        {
            if (时间.Contains("已刷"))
            {
                return TimeSpan.FromMinutes(0);
            }
            else
            {
                string 时间文本 = Regex.Replace(时间, "[^0-9]", "");
                int m = int.Parse(时间文本);
                return TimeSpan.FromMinutes(m);
            }
        }
        public DateTime 记录时间 { get; set; }
        public TimeSpan 时间
        {
            get
            {
                return _时间;
            }
            set
            {
                this.记录时间 = DateTime.Now;
                _时间 = value;
            }
        }

        public int 页 { get; set; }
        public Rectangle 范围 { get; set; }
        public _Boss表项_ 表项 { get; set; }
    }
    public class Boss刷新表_
    {
        public static Boss提醒_[] 表 = new Boss提醒_[(int)_Boss表项_.数量_];
        public static Rectangle 第一个名称范围 = Rectangle.FromLTRB(413, 258, 569, 284);
        public string[] 每页验证名 = new string[] { "将军", "穴", "焰火", "法师炼狱", "道士炼狱", "桃园", "炼狱魔境" };
        public 挂机人物_ 人物 { get; set; }
        public Boss刷新表_(挂机人物_ 人物)
        {
            this.人物 = 人物;
            int X = 765, Y = 253, R = 845, 序号 = 0;
            for (int 页号 = 0; 页号 < 7; 页号++)
            {
                for (var i = 0; i < 10; i++, 序号++)
                {
                    Y += i * 34;
                    var Rect = Rectangle.FromLTRB(X, Y, R, Y + 34);
                    if (页号 == 6 && i == 6) break;
                    表[序号] = new Boss提醒_("0", 页号, Rect, (_Boss表项_)序号);
                    Y = 253;
                }
            }
        }

        public int 查看BOSS刷新时间(_Boss表项_ 表项)
        {
            打开Boss表();
            var 数据 = 表[(int)表项];
            for (var 页 = 0; 页 < 数据.页; 页++)
            {
                键鼠_.左键单击(750, 636);
                其他_.循环判断(() => 判断是否成功(页 + 1), 5);
            }
            var 刷新时间 = 图像_.识别文字(数据.范围);
            数据.时间 = Boss提醒_.编译(刷新时间);
            var R = Rectangle.FromLTRB(第一个名称范围.Left, 数据.范围.Top, 第一个名称范围.Right, 数据.范围.Bottom);
            人物.输出("BOSS: " + 表项.ToString() + " 刷新时间 - " + ((int)数据.时间.TotalMinutes).ToString());
            关闭Boss表(数据.页);
            return (int)数据.时间.TotalMinutes;
        }

        private bool 判断是否成功(int 序号)
        {
            序号 = 序号 > 6 ? 6 : 序号;
            var 内容 = 每页验证名[序号];
            return 其他_.循环判断(() =>
            {
                return 图像_.查找文字(第一个名称范围, s =>
                {
                    return s.Contains(内容);
                }).X != -1;
            }, 2);
        }

        public bool 打开Boss表()
        {
            UI_.设置展开材料行();
            键鼠_.左键单击(750, 75);
            其他_.延迟(其他_.时长_1000);
            UI_.设置收缩材料行();
            var 到达 = 其他_.循环判断(() => 判断是否成功(0), 5);
            if (!到达) throw new Exception("没能打开Boss表");
            其他_.延迟(其他_.时长_1000);
            return 到达;
        }

        public bool 关闭Boss表(int 当前页)
        {
            键鼠_.左键单击(870, 156);
            var 结果 = 其他_.循环判断(() => !判断是否成功(当前页), 5);
            if (!结果) throw new Exception("没能关闭Boss表");
            return 结果;
        }

        public void 识别Boss刷新表()
        {
            人物.输出("开始检查BOSS时间表");
            打开Boss表();
            int X = 765, Y = 253, R = 845, 序号 = 0;

            for (int 页号 = 0; 页号 < 7; 页号++)
            {
                for (var i = 0; i < 10; i++, 序号++)
                {
                    Y += i * 34;
                    var Rect = Rectangle.FromLTRB(X, Y, R, Y + 34);
                    其他_.延迟(其他_.时长_600);
                    var 刷新时间 = 图像_.识别文字(Rect);
                    if (页号 == 6 && i == 6) break;
                    表[序号].时间 = Boss提醒_.编译(刷新时间);
                    Y = 253;
                }
                if (页号 == 6)
                {
                    人物.输出("关闭BOSS时间表");
                    关闭Boss表(页号);
                }
                else
                {
                    人物.输出("查看下页BOSS时间");
                    键鼠_.左键单击(750, 636);
                }
                if (!判断是否成功(页号))
                {
                    throw new Exception("BOSS列表翻页出现错误");
                }
            }
        }
    }
}
